import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:恋恋
 * Date:2023-10-08
 * Time:16:46
 */


public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
        /**
         * 基本操作
         */
        // test01();
        /**
         *  操作测试对象
         */
       // test02();
        /**
         * submit和click区别：在非form标签中的情况
         * 这个test03会报错，因为点击的是百度中新闻超链接
         * 这个超链接没有放到form标签中
         */
       // test03();
//        test04();
       // test05();
        /**
         * 显式等待
         */
        //test06();
        /**
         * 浏览器
         * 前进
         * 后退
         */
        //test07();
        /**
         * 键盘事件
         */
        //test08();
        /**
         * 鼠标事件
         */
       // test09();
        /**
         * 浏览器关闭
         */
      //  test10();
        /**
         * 切换界面
         */
        //test11();
        /**
         * 截图
         */
        test12();
        /**
         * 定位一组元素
         */

       // page01();
        /**
         *多层框架
         */
      // ？  page02();
        /**
         * 下拉框的处理
         */
       // page03();
        /**
         * 针对alert操作
         */
        //page04();
        /**
         *文件上传
         */
        //page05();

        





    }

    private static void test12() throws InterruptedException, IOException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        //等待页面加载
        sleep(3000);
        //截图对象
        File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //存放的地址+文件名
        FileUtils.copyFile(file,new File("C:\\Users\\恋恋\\Pictures\\Screenshots//2023.png"));
    }

    private static void test11() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        //找到新闻，并点击
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        //通过getWindowHandles获取所有的窗口句柄
        //通过getWindowHandle获取get打开的页面窗口句柄
        System.out.println(webDriver.getWindowHandle());
        Set<String> handles =  webDriver.getWindowHandles();
        String t_handle = "";
        for (String handle:handles) {
            t_handle = handle ;
        }
        //跳转到新闻界面上，并输入新闻联播
        //直接查找，是不能找到元素的，是因为元素默认是在get打开的这个页面找元素的
        //所以需要句柄
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("s_btn_wr")).click();

    }

    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        sleep(3000);
        //点击新闻标签
      //  webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        //quith会关闭整个浏览器
            //清除缓存：Application ——》 Cookies 中就没有了
        //webDriver.quit();
        //close关闭get获取的页面
        //不会清空缓存
        webDriver.close();
    }

    private static void page05() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20231009testcode/src/main/page/page05.html?_ijt=vgvkl9odjn6s8mnp7cn4hge8gj&_ij_reload=RELOAD_ON_SAVE");
        //是在哪个标签底下：button还是input
        //上传文件，将路径复制下来
        webDriver.findElement(By.cssSelector("input")).sendKeys("C:\\Users\\恋恋\\Pictures\\Camera Roll");
    }

    private static void page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20231009testcode/src/main/page/page04.html?_ijt=sovae30ulnoil2gv2vs2nigt1a&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("button")).click();
        //alert弹窗取消:利用switchTo驱动
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        //点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        //从alert弹窗中输入沙天琦
        webDriver.switchTo().alert().sendKeys("沙琪玛");
        //alert弹窗确定:accept
        sleep(3000);
        webDriver.switchTo().alert().accept();


    }

    private static void page03() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20231009testcode/src/main/page/page03.html?_ijt=khov1gpn023apl136gmh2srgnh&_ij_reload=RELOAD_ON_SAVE");
        //利用select来完成下拉框的操作
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        //根据下标下拉——以0为开始
        select.deselectByIndex(3);
        //根据数值下拉
        select.deselectByValue("12.51");

    }

    private static void page02() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20231009testcode/src/main/page/page02.html?_ijt=tfak6od35ugloh30jb6206fe0t&_ij_reload=RELOAD_ON_SAVE");
        //直接点击是不可以找到的，因为Click是在iframe底下的
        //首先获取iframe——>驱动switchTo——>frame(ifame的id值）
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
        //百度不让内嵌



    }

    private static void page01() {
        WebDriver webDriver = new ChromeDriver();

        webDriver.get("http://localhost:63342/_20231009testcode/src/main/page/page01.html?_ijt=4msfetsutb9j477cmsruf3j1mt&_ij_reload=RELOAD_ON_SAVE");
        //害怕这批元素没有渲染出来，加一个智能等待，选择隐式等待
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        //input是前端的知识
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            //如果每个元素等于type值等于checkbox进行点击
            //getAttribute获取页面上的元素的属性值，里面的type是当前元素属性
            if(webElements.get(i).getAttribute("type").equals("checkbox")){

                webElements.get(i).click();

            }else{
                //否则什么也不操作
                ;
            }


        }

    }

    private static void test09() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //找到图片按钮——copy selector，并将图片按钮赋值给webElement
        WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        sleep(3000);
        //鼠标右击
        Actions actions =new Actions(webDriver);
        sleep(3000);
        //移动这个图片按钮.右击.执行
        actions.moveToElement(webElement).contextClick().perform();

    }

    private static void test08() throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度网页
        webDriver.get("https://www.baidu.com/");
        //搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
        //control+A
        webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"A");
        sleep(5000);
        //control+C
        webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"C");
        sleep(5000);
        webDriver.findElement(By.cssSelector("kw")).clear();
        sleep(5000);
        //control+v
        webDriver.findElement(By.cssSelector("kw")).sendKeys(Keys.CONTROL,"V");
        sleep(5000);

    }

    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com/");
        //搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        sleep(3000);
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
        //强制等待3秒
        sleep(3000);
        //浏览器后退
        webDriver.navigate().back();
        //强制等待3秒
        sleep(3000);
        //查看对应的刷新
        webDriver.navigate().refresh();
        sleep(3000);
        //浏览器前进
        webDriver.navigate().forward();
        sleep(3000);
        //若结果和预期不符，可能是界面太快，没有看清楚
        //滚轮条操作
        //将webDrive强制转换成 JavascriptExecutor 的 脚本
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=19999");
        //设置一定像素大小
        webDriver.manage().window().maximize();//最大
        webDriver.manage().window().fullscreen();//全屏
        webDriver.manage().window().setSize(new Dimension(600,1000));//设置宽和长
    }

    private static void test06() {
        /**
         * 若直接创建驱动会出现404的界面，就需要完整的将chrome对象创建和允许所有请求请求
         */
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        //打开百度网页
        webDriver.get("https://www.baidu.com/");
        //创建显式等待
        WebDriverWait wait = new WebDriverWait(webDriver,30000);
        //判断元素是否可以被点击(右击->copy selector)
       // wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(4)")));
        //校验当前界面的title是不是对应的信息
        wait.until(ExpectedConditions.titleIs("百度一下，你就知道"));

    }

    private static void test05() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        String url = webDriver.getCurrentUrl();
        String title = webDriver.getTitle();
        if(url.equals("https://www.baidu.com/")&& title.equals("百度一下，你就知道")){
            System.out.println("当前页面url: "+url+",当前页面title:"+title);
            System.out.println("测试成功");
        }else{
            System.out.println("测试失败");
        }
    }

    private static void test04() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //创建驱动
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        //获取百度一下按钮的元素的属性，getText获取不了元素的属性
       //String button_value = webDriver.findElement(By.cssSelector("#su")).getText();
        //getAttribute(“获取元素的哪个属性”)，其中是获取（百度一下)按钮这个元素的value属性
        String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        System.out.println(button_value);
        //校验
        if(button_value.equals("百度一下")){
            System.out.println("测试通过");
        }else{
            System.out.println(button_value);
            System.out.println("测试不通过");
        }
    }

    private static void test03() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //创建驱动
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
    }
    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开网页get("网页地址")
        webDriver.get("https://www.baidu.com/");
        //找到百度搜索输入框（id选择器），并输入java106
        sleep(3000);//删除太快，延迟一下，这样可以看到结果
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("java106");
        //找到百度搜一下按钮，并点击
        //方法一：click()
        //webDriver.findElement(By.cssSelector("#su")).click();
        //方法二：submit()
        webDriver.findElement(By.cssSelector("#su")).submit();
        //sleep强制等待
        //sleep(300000000);
        /**
         * 隐式等待：等待3天
         */
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        //定位输入框，并清空(清空输入框中的数据)
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

    private static void test01() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度网页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        //  webDriver.findElements() :是找到一批元素
        //利用css来查找元素——方法1
        //找到一个元素(css(“.+类选择器的类名”)) 切记还有点,等于对应找到的这个元素
        //id选择器（#id）
        WebElement element = webDriver.findElement(By.cssSelector("#kw"));
        //利用xpath(右击选择copy,并选择copy Xpath)来查找元素——方法2
        //WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入软件测试
        element.sendKeys("软件测试");
        //找到百度一下按钮
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
        //校验之前让他强制等待
        sleep(3000);

        //校验
        //找到搜索结果
        //findElements返回的类型是List<WebElement>
        List<WebElement> elements= webDriver.findElements(By.cssSelector("a em"));
        int flag = 0;
        for (int i = 0; i < elements.size(); i++) {
            /** 方法一：
            //getText取得元素名称
            System.out.println(elements.get(i).getText());
            //如果返回的结果有软件测试，证明测试通过，否则测试不通过
            if(!elements.get(i).getText().equals("软件测试")){
                System.out.println("测试不通过");
            }else{
                System.out.println("测试通过");
            }
             **/
            /**方法二：没有包含软件或者测试，只要一个不满足都不通过 （！软件||！测试 = 软件 && 测试）
            if(!elements.get(i).getText().contains("软件") || !elements.get(i).getText().contains("测试")){
                System.out.println(elements.get(i).getText());
                System.out.println("测试不通过");
            }else{
                System.out.println("测试通过");
            }
             **/
            /**方法三：用标识符flag
             **/
            if(elements.get(i).getText().equals("软件测试")){
                flag = 1;
                System.out.println("测试通过");

            }
            if( flag == 0 ){
                System.out.println("测试不通过");
            }
        }
    }
}